// cf-526e
// 题意：给定n(<=10^6)个数，围成一个圈，现在有q(<=50)个询问，对于每个询问，
//       输入一个整数b(<=10^15)，现在要将原数圈划分成若干连续段，使得
//       每一段的和不超过b。问最小划分成多少段。
//
// 题解：方便处理可以把n个数展开成2*n个数链，然后做一次单调队列维护出
//       一段连续和恰小于等于b的最小长度。然后可以知最终划分的若干段
//       肯定有一段起点在这个最小段之中。假设最小段长度为l，那么我们
//       可以用O(l)枚举这个起点，因为每一段长度肯定是至少为l，所以
//       最终段数至多是O(n/l)，在之前维护单调队列的时候顺便维护出next
//       数组，贪心的算出每个位置最多可以往后到哪个位置，这样对于一个
//       起点只要用O(n/l)的时间算出答案，然后更新下，对于一次询问总的
//       复杂度就是O(n)。
//
// run: time -p $exec < input
#include <iostream>
#include <algorithm>

int constexpr maxn = 1000006;
long long a[2 * maxn];
int monoq[4 * maxn];
int next[maxn];
int n, q;

int iterate(int s)
{
	int ret = 0, ts = s + n - 1;
	for (; s <= ts && s <= 2 * n; s = next[s]) ret++;
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n >> q;
	for (int i = 1; i <= n; i++) {
		std::cin >> a[i];
		a[n + i] = a[i];
	}
	for (long long b; q--; ) {
		std::cin >> b;
		long long sum = 0;
		int head = 1, tail = 0, pos = 1;
		int min = n;
		for (int i = 1; i <= n; i++) next[i] = n + i;
		for (int i = n + 1; i <= 2 * n; i++) next[i] = 2 * n + 1;
		for (int i = 1; i <= 2 * n; i++) {
			sum += a[i];
			for (; head <= tail && sum > b; sum -= a[monoq[head++]]) {
				next[monoq[head]] = i;
				if (i - monoq[head] < min) {
					min = i - monoq[head];
					pos = monoq[head];
				}
			}
			monoq[++tail] = i;
		}

		int ans = n;
		for (int i = 0; i <= min; i++) {
			int start = pos + i;
			ans = std::min(ans, iterate(start));
		}
		std::cout << ans << '\n';
	}
}

